package com.wang.lottery.domain.activity.repository;

import com.baomidou.mybatisplus.extension.service.IService;
import com.wang.lottery.common.Constants;
import com.wang.lottery.domain.activity.model.po.Activity;
import com.wang.lottery.domain.activity.model.req.PartakeReq;
import com.wang.lottery.domain.activity.model.res.StockResult;
import com.wang.lottery.domain.activity.model.vo.ActivityBillVO;
import com.wang.lottery.domain.activity.model.vo.ActivityPartakeRecordVO;
import com.wang.lottery.domain.activity.model.vo.ActivityVO;
import com.wang.lottery.domain.award.model.vo.AwardVO;
import com.wang.lottery.domain.strategy.model.vo.StrategyDetailVO;
import com.wang.lottery.domain.strategy.model.vo.StrategyVO;

import java.util.List;

/**
 * @author wjh
 * @create 2023-11-04 15:31
 * 活动仓库服务(活动表、奖品表、策略表、策略明细表)
 */
public interface IActivityRepository extends IService<Activity> {

    /**
     * 添加活动配置
     * @param activity 活动配置
     */
    void add(ActivityVO activity);

    /**
     * 添加奖品配置集合
     * @param awardVOList 奖品配置集合
     */
    void addAward(List<AwardVO> awardVOList);
    
    /**
     * 添加策略配置集合
     * @param strategyVO 策略配置
     */
    void addStrategy(StrategyVO strategyVO);


    /**
     * 添加策略明细配置
     *
     * @param strategyDetailList 策略明细集合
     */
    void addStrategyDetailList(List<StrategyDetailVO> strategyDetailList);

    /**
     * 变更活动状态
     *
     * @param activityId    活动ID
     * @param beforeState   修改前状态
     * @param afterState    修改后状态
     * @return              更新结果
     */
    boolean alterStatus(Long activityId, Constants.ActivityState beforeState, Constants.ActivityState afterState);

    /**
     * 查询活动账单信息【库存、状态、日期、个人参与次数】
     * @param req 参与请求参数
     * @return 活动账单
     */
    ActivityBillVO queryActivityBill(PartakeReq req);

    /**
     * 扣减活动库存数量
     * @param req 参与活动请求参数
     * @param stockCount 剩余库存数量
     * @return 扣减结果
     */
    StockResult subtractionActivityStockByRedis(PartakeReq req, Integer stockCount);

    /**
     * 扫描待处理的活动列表，状态为：通过、活动中
     *
     * @param id ID
     * @return 待处理的活动集合
     */
    List<Activity> scanToDoActivityList(Long id);

    /**
     * 释放活动库存锁
     * @param stockKey 库存锁
     */
    void recoverActivityCacheStockByRedis(String stockKey);

    /**
     * 更新活动库存
     * @param activityPartakeRecordVO redis中记录的剩余库存
     */
    void updateActivityStock(ActivityPartakeRecordVO activityPartakeRecordVO);
}
